package com.tt.job.api.type.dataflow;

import com.tt.job.api.Job;
import com.tt.job.api.JobContext;
import com.tt.job.api.JobResult;

import java.util.List;

/**
 * 数据流任务的接口，数据流任务的处理需要用多实例运行来加速
 * //TODO
 */
public interface DataFlowJob<T> extends Job {

    /**
     * 是否允许并行执行任务，当允许时，将会利用多线程，多次fetchData然后利用多个线程并发处理任务<br>
     * <b>注意如果任务对数据的顺序处理要求高时，不能开启此选项</b><br>
     * 并发模式下，个别任务的失败将被忽略
     * @return
     */
    boolean isConcurrent();

    /**
     * 获取任务需要处理的任务数据，注意不出现重复数据<br>
     * 该方法会在单一线程中多次执行，无需考虑多线程并发可能引起的问题
     * @param context
     * @return null 表示没有后续数据需要处理了
     */
    List<T> fetchData(JobContext context);

    /**
     * 处理任务数据
     * @param context
     * @param data
     */
    JobResult processData(JobContext context, List<T> data);

}
